﻿Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Interop
Imports System.Data
Imports System.IO
Imports System.Text
Imports System.Net
Imports System.Threading
Imports System.Windows.Controls.Primitives

Class CMFactorUDI
    Private FactorUDIServicio As New CFactorUDIServicio()
    Dim lstFactorUDI As New List(Of CFactorUDI)

#Region "Carga página"
    Private Sub CMFactorUDI_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles Me.Loaded
        Try
            txtAñoinicial.Text = DateAndTime.DatePart(DateInterval.Year, Now.Date)
            txtAñoFinal.Text = DateAndTime.DatePart(DateInterval.Year, Now.Date)

            Mouse.OverrideCursor = Cursors.Arrow
        Catch ex As Exception
            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Carga página factor UDI", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

#End Region

#Region "Modificaciones campos"
    Private Sub txtUltimosDias_TextChanged(sender As System.Object, e As System.Windows.Controls.TextChangedEventArgs) Handles txtUltimosDias.TextChanged
        Dim t As Controls.TextBox = sender
        Dim strFinal As String

        strFinal = t.Text

        For Each aux As Char In t.Text
            If Not Char.IsNumber(CChar(aux)) Then
                strFinal = t.Text.Replace(aux, "")
            End If
        Next

        txtUltimosDias.Text = strFinal
    End Sub

    Private Sub txtUltimosDias_PreviewTextInput(sender As System.Object, e As System.Windows.Input.TextCompositionEventArgs) Handles txtUltimosDias.PreviewTextInput
        If Not Char.IsNumber(CChar(e.Text)) Then
            e.Handled = True
        End If
    End Sub

    'Private Sub txtDiasExportar_TextChanged(sender As System.Object, e As System.Windows.Controls.TextChangedEventArgs) Handles txtDiasExportar.TextChanged
    '    Dim t As Controls.TextBox = sender
    '    Dim strFinal As String

    '    strFinal = t.Text

    '    For Each aux As Char In t.Text
    '        If Not Char.IsNumber(CChar(aux)) Then
    '            strFinal = t.Text.Replace(aux, "")
    '        End If
    '    Next

    '    txtDiasExportar.Text = strFinal
    'End Sub

    'Private Sub txtDiasExportar_TextInput(sender As System.Object, e As System.Windows.Input.TextCompositionEventArgs) Handles txtDiasExportar.TextInput
    '    If Not Char.IsNumber(CChar(e.Text)) Then
    '        e.Handled = True
    '    End If
    'End Sub

    Private Sub calInicial_DisplayModeChanged(sender As System.Object, e As System.Windows.Controls.CalendarModeChangedEventArgs) Handles calInicial.DisplayModeChanged

        Dim cal As Calendar = sender

        If cal.DisplayMode = CalendarMode.Year Then
            Dim fechaini As Date = cal.DisplayDate

            txtAñoinicial.Text = DatePart(DateInterval.Year, fechaini).ToString

            cal.DisplayDate = DateAdd(DateInterval.Year, -11, fechaini)
            cal.SelectedDate = fechaini

            calInicial = cal

            cal.DisplayMode = CalendarMode.Decade
        End If
    End Sub

    Private Sub calFinal_DisplayModeChanged(sender As System.Object, e As System.Windows.Controls.CalendarModeChangedEventArgs) Handles calFinal.DisplayModeChanged

        Dim cal As Calendar = sender

        If cal.DisplayMode = CalendarMode.Year Then
            Dim fechaini As Date = cal.DisplayDate

            txtAñoFinal.Text = DatePart(DateInterval.Year, fechaini).ToString

            cal.DisplayDate = DateAdd(DateInterval.Year, -11, fechaini)
            cal.SelectedDate = fechaini

            calFinal = cal

            cal.DisplayMode = CalendarMode.Decade
        End If
    End Sub
#End Region

#Region "Buscar factores UDI"
    Private Sub btnConsultar_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnConsultar.Click
        Dim blnValidacion As Boolean = ValidarCampos(1)

        If blnValidacion Then
            Try
                Dim Aplicacion As _Application
                Dim strRutaFactorUDI As String
                Dim wbkBanxico As Workbook
                Dim hojaBanxico As Worksheet
                Dim rangoBanxico As Range
                Dim intBitacoraBanxico As Integer, intRenglonInicial As Integer, TotalRenglonesBanxico As Integer, intUltimosDias As Integer

                Mouse.OverrideCursor = Cursors.Wait

                intUltimosDias = Convert.ToInt32(txtUltimosDias.Text)

                Try
                    Aplicacion = GetObject(, "Excel.Application")
                Catch ex As Exception
                    Aplicacion = CreateObject("Excel.Application")
                End Try

                strRutaFactorUDI = FactorUDIServicio.ObtieneRutaFactorUDI()

                strRutaFactorUDI = strRutaFactorUDI.Replace("#AI", txtAñoinicial.Text).Replace("#AF", txtAñoFinal.Text)

                intBitacoraBanxico = CUtileria.GrabarBitacora("FactorUDI", "Carga datos Banxico", "Carga datos desde " + strRutaFactorUDI)

                wbkBanxico = Aplicacion.Workbooks.Open(strRutaFactorUDI, [ReadOnly]:=True)

                lstFactorUDI.Clear()

                hojaBanxico = wbkBanxico.Sheets(1)

                rangoBanxico = hojaBanxico.UsedRange

                TotalRenglonesBanxico = rangoBanxico.Rows.Count

                If intUltimosDias >= ((TotalRenglonesBanxico - 19) + 1) Then
                    intRenglonInicial = 19
                Else
                    intRenglonInicial = TotalRenglonesBanxico - intUltimosDias + 1
                End If

                For RenglonInicial = intRenglonInicial To TotalRenglonesBanxico Step 1
                    Dim fac As New CFactorUDI(Convert.ToDateTime(hojaBanxico.Cells(RenglonInicial, 1).Value), Convert.ToDouble(hojaBanxico.Cells(RenglonInicial, 2).Value2.ToString))

                    lstFactorUDI.Add(fac)
                Next

                wbkBanxico.Close()

                grdFactorUDI.ItemsSource = Nothing

                If lstFactorUDI.Count > 0 Then
                    grdFactorUDI.ItemsSource = lstFactorUDI
                    btnExportar.IsEnabled = True
                    btnEliminaFactor.Visibility = System.Windows.Visibility.Visible
                Else
                    btnExportar.IsEnabled = False

                    btnEliminaFactor.Visibility = System.Windows.Visibility.Hidden
                End If

                Mouse.OverrideCursor = Cursors.Arrow

                CUtileria.CompletarRegBitacora(intBitacoraBanxico)
            Catch ex As Exception
                Dim intErrorBanxico As Integer = CUtileria.GrabarBitacora("FactorUDI", "Carga datos Banxico", ex.Message)
                CUtileria.CompletarRegBitacora(intErrorBanxico)

                Mouse.OverrideCursor = Cursors.Arrow

                MessageBox.Show("Error TI500. " & ex.Message, "Búsqueda", MessageBoxButton.OK, MessageBoxImage.Error)
            End Try
        End If
    End Sub

    Private Sub btnEliminaFactor_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnEliminaFactor.Click
        Dim factoresCargados As List(Of CFactorUDI) = grdFactorUDI.ItemsSource()
        Dim factorEliminar As New List(Of CFactorUDI)
        Dim factorAgregado As New CFactorUDI()
        Dim factorRecorrido As New CFactorUDI()

        If grdFactorUDI.SelectedCells.Count > 0 Then
            For Each celda As DataGridCellInfo In grdFactorUDI.SelectedCells
                factorRecorrido = CType(celda.Item, CFactorUDI)

                If Not (factorRecorrido.Equals(factorAgregado)) Then
                    factorEliminar.Add(CType(celda.Item, CFactorUDI))

                    factorAgregado = factorRecorrido
                End If
            Next

            For Each T As CFactorUDI In factorEliminar
                factoresCargados.Remove(T)
            Next

            grdFactorUDI.UpdateLayout()
            grdFactorUDI.Items.Refresh()

            If factoresCargados.Count = 0 Then
                btnEliminaFactor.Visibility = System.Windows.Visibility.Hidden
                btnExportar.IsEnabled = False
            End If
        End If


    End Sub

    Private Function ValidarCampos(ByVal intOpcion As Integer) As Boolean
        If intOpcion = 1 Then
            If txtUltimosDias.Text.Length = 0 Then
                Mouse.OverrideCursor = Cursors.Arrow

                MessageBox.Show("Favor de indicar el número de días a mostrar", "Búsqueda", MessageBoxButton.OK, MessageBoxImage.Stop)

                Return False
            ElseIf Convert.ToInt32(txtAñoinicial.Text) > Convert.ToInt32(txtAñoFinal.Text) Then
                Mouse.OverrideCursor = Cursors.Arrow

                MessageBox.Show("El año inicial tiene que ser mayor o igual al año final", "Búsqueda", MessageBoxButton.OK, MessageBoxImage.Stop)

                Return False
            End If
        End If

        Return True
    End Function
#End Region

#Region "Exportar"
    Private Sub btnExportar_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnExportar.Click
        
        
        'INI Candado ejecucion UDI 2015-04-10 IRI
           Dim sMsgErrorCandado    As String = ""
           Dim tiempoEsperaCandado as Integer =  FactorUDIServicio.ObtenerTiempoDeEsperaEjec (sMsgErrorCandado)
           If sMsgErrorCandado.Equals("") then 
              If tiempoEsperaCandado < 0 then 
                 MessageBox.Show ("Es necesario esperar " &  tiempoEsperaCandado * -1 & " minuto(s) para poder ejecutar este proceso.","Validar horario de ejecución",MessageBoxButton.OK, MessageBoxImage.Information)
                 Exit Sub                                
              End If
           Else              
             MessageBox.Show ("Ocorrió el siguiente error al consultar el tiempo de espera: " & sMsgErrorCandado & ". Contacte a Soporte para continuar.","Validar horario de ejecución",MessageBoxButton.OK, MessageBoxImage.Error) 
             Exit Sub 
           End If
        'FIN Candado ejecucion UDI 2015-04-10 IRI

        
        
        Dim strRutaAplicacionFTP As String = FactorUDIServicio.ObtieneRutaFTP()
        If File.Exists(strRutaAplicacionFTP) Then
            Dim msgresultado As MessageBoxResult = MessageBox.Show("¿Confirma que desea realizar la exportación?", "Exportación", MessageBoxButton.YesNo, MessageBoxImage.Question)

            If msgresultado = MessageBoxResult.Yes Then

                Mouse.OverrideCursor = Cursors.Wait


                'INI Candado ejecucion UDI 2015-04-10 IRI
                  Dim fechaHoraEjec As String = CServiciosMacrosSyBaseDB.FechaHoyDB.ToString ("yyyy-MM-dd HH:mm:ss")   
                  If FactorUDIServicio.ActualizarFechaHoraEjecucion (fechaHoraEjec, sMsgErrorCandado) = False 
                     MessageBox.Show ("La fecha de ejecución del proceso no pudo ser actualizada debido a: " & sMsgErrorCandado & ". Es conveniente esperar 10 minutos antes de volver a ejecutar este proceso después de que termine.","Validar horario de ejecución",MessageBoxButton.OK, MessageBoxImage.Exclamation)
                  End If
                'FIN Candado ejecucion UDI 2015-04-10 IRI



                Try
                    Dim strRuta As String, strRutaDirectorio As String, strNombreFinalArchivo As String
                    Dim indice As Integer = 0, indiceAux As Integer = 2

                    strRuta = FactorUDIServicio.ObtieneRutaArchivoFactorUDI()

                    While indice >= 0
                        indice = strRuta.IndexOf("\", indiceAux)

                        If indice > 0 Then
                            indiceAux = indice + 1
                        End If
                    End While

                    strRutaDirectorio = strRuta.Substring(0, indiceAux - 1)

                    If Directory.Exists(strRutaDirectorio) Then
                        Try
                            Dim intBitacoraExportacion As Integer = CUtileria.GrabarBitacora("FactorUDI", "Exportación", "Se genera archivo y se exporta vía FTP")
                            Dim strConstructor As StringBuilder = New StringBuilder()
                            Dim swAux As StreamWriter

                            strNombreFinalArchivo = strRuta + "." + Date.Now.ToString("yyyyMMdd") + ".000000.001.UDI.DAT"

                            For Each facAux As CFactorUDI In lstFactorUDI
                                Dim strVal As String = facAux.Valor.ToString.Replace(",", "").Replace(".", "")

                                If strVal.Length <= 7 Then
                                    strVal = "0" & strVal & "0000000"
                                    strVal = strVal.Substring(0, 11)
                                ElseIf strVal.Length = 8 Then
                                    strVal = strVal & "0000"
                                    strVal = strVal.Substring(0, 11)
                                End If

                                strConstructor.Append("UDI" + Date.Now.ToString("yyyyMMdd") + facAux.Fecha.ToString("yyyyMMdd") + strVal + vbNewLine)
                            Next

                            swAux = New StreamWriter(strNombreFinalArchivo)
                            swAux.WriteLine(strConstructor)
                            swAux.Close()

                            EnviaArchivoFTP(strNombreFinalArchivo, strRutaAplicacionFTP, strRutaDirectorio)
                            Mouse.OverrideCursor = Cursors.Arrow

                            CUtileria.CompletarRegBitacora(intBitacoraExportacion)
                        Catch ex As Exception
                            Dim intBitacoraErrorDos As Integer = CUtileria.GrabarBitacora("FactorUDI", "Exportación", ex.Message)
                            CUtileria.CompletarRegBitacora(intBitacoraErrorDos)

                            Mouse.OverrideCursor = Cursors.Arrow

                            MessageBox.Show("Error TI500. " & ex.Message, "Exportación", MessageBoxButton.OK, MessageBoxImage.Error)
                        End Try
                    Else
                        Mouse.OverrideCursor = Cursors.Arrow

                        MessageBox.Show("Verificar que existe la ruta: " + strRutaDirectorio + " para almacenar el archivo a exportar", "Exportación", MessageBoxButton.OK, MessageBoxImage.Error)
                    End If
                Catch ex As Exception
                    Dim intBitacoraError As Integer = CUtileria.GrabarBitacora("FactorUDI", "Exportación", ex.Message)
                    CUtileria.CompletarRegBitacora(intBitacoraError)

                    Mouse.OverrideCursor = Cursors.Arrow

                    MessageBox.Show("Error TI500. " & ex.Message, "Exportación", MessageBoxButton.OK, MessageBoxImage.Error)
                End Try
            End If
        Else
            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Verificar que existe el archivo: " + strRutaAplicacionFTP + " para poder exportar el archivo", "Exportación", MessageBoxButton.OK, MessageBoxImage.Error)
        End If
    End Sub

    Private Sub EnviaArchivoFTP(ByVal strArchivo As String, ByVal strRutaAplicacionFTP As String, ByVal strRutaDirectorio As String)        
        Dim dtDatosFTP As New System.Data.DataTable
        Dim strConstructor As StringBuilder = New StringBuilder()
        Dim swAux As StreamWriter
        Dim strRutaComandos As String, strRutaLog As String, strNombreFinalBat As String, strArchivoAux As String
        Dim indice As Integer = 0, indiceAux As Integer = 2, indiceError As Integer = 0, indiceErrorDos As Integer = 0
        Dim proceso As New Process()
        Dim info As FileInfo

        While indice >= 0
            indice = strArchivo.IndexOf("\", indiceAux)

            If indice > 0 Then
                indiceAux = indice + 1
            End If
        End While

        strArchivoAux = strArchivo.Substring(indiceAux, strArchivo.Length - indiceAux)
        strNombreFinalBat = strRutaDirectorio + "\UDI.cmd"
        strRutaComandos = strRutaDirectorio + "\sftpCMD.txt"
        strRutaLog = strRutaDirectorio + "\LogFTP.log"

        If File.Exists(strRutaLog) Then
            File.Delete(strRutaLog)
        End If

        If File.Exists(strNombreFinalBat) Then
            File.Delete(strNombreFinalBat)
        End If

        If File.Exists(strRutaComandos) Then
            File.Delete(strRutaComandos)
        End If

        dtDatosFTP = FactorUDIServicio.ObtieneParametrosFTP()

        strConstructor.Append("cd " + dtDatosFTP.Rows(0)(0).ToString + vbNewLine + "put """ + strArchivo + """" + vbNewLine + "chmod 777 " + dtDatosFTP.Rows(0)(0).ToString + strArchivoAux + vbNewLine + "exit")
        swAux = New StreamWriter(strRutaComandos)
        swAux.WriteLine(strConstructor)
        swAux.Close()

        strConstructor = New StringBuilder()
        strConstructor.Append(strRutaAplicacionFTP + " " + dtDatosFTP.Rows(3)(0).ToString + " -P " + dtDatosFTP.Rows(4)(0).ToString + " -l " + dtDatosFTP.Rows(1)(0).ToString + " -pw " + dtDatosFTP.Rows(2)(0).ToString + " -b """ + strRutaComandos + """ -batch>>""" + strRutaLog + """")

        swAux = New StreamWriter(strNombreFinalBat)
        swAux.WriteLine(strConstructor)
        swAux.Close()

        proceso.EnableRaisingEvents = True
        proceso.StartInfo.FileName = strNombreFinalBat
        proceso.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
        proceso.Start()
        proceso.WaitForExit()

        Thread.Sleep(3000)

        File.Delete(strNombreFinalBat)
        File.Delete(strRutaComandos)

        If File.Exists(strRutaLog) Then
            info = My.Computer.FileSystem.GetFileInfo(strRutaLog)

            If info.Length = 0 Then
                MessageBox.Show("Ocurrió un error al exportar el archivo a la ruta FTP y no se generó información en el archivo de log", "Exportación", MessageBoxButton.OK, MessageBoxImage.Error)
            Else
                Dim strLectura As String = File.ReadAllText(strRutaLog)
                indiceError = strLectura.IndexOf("local: unable to open")
                indiceError = strLectura.IndexOf("no such file or directory")

                If indiceError > 0 Or indiceErrorDos > 0 Then
                    Mouse.OverrideCursor = Cursors.Arrow

                    MessageBox.Show("Ocurrió un error al exportar los datos, favor de revisar el archivo: " + strRutaLog, "Exportación", MessageBoxButton.OK, MessageBoxImage.Error)
                Else
                    Mouse.OverrideCursor = Cursors.Arrow

                    MessageBox.Show("Archivos exportado correctamente", "Exportación", MessageBoxButton.OK, MessageBoxImage.Information)
                End If
            End If
        Else
            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Ocurrió un error al exportar el archivo a la ruta FTP y no se generó archivo log", "Exportación", MessageBoxButton.OK, MessageBoxImage.Error)
        End If
    End Sub
#End Region
End Class
